//*******************************************************************************
//	Copyright (c) 2006 Patterson Consulting, Inc
//	All rights reserved.
//
// 	Redistribution and use in source and binary forms, with or without
// 	modification, are permitted provided that the following conditions are met:
//
// 		* Redistributions of source code must retain all references to Patterson
// 		  Consulting, Danny Patterson, com.dannypatterson and dannypatterson.com.
//		* Redistributions of source code must retain the above copyright
//		  notice, this list of conditions and the following disclaimer.
//		* Redistributions in binary form must reproduce the above copyright
//		  notice, this list of conditions and the following disclaimer in the
//		  documentation and/or other materials provided with the distribution.
//		* Neither the name of the Patterson Consulting nor the names of its
//		  contributors may be used to endorse or promote products derived from
//		  this software without specific prior written permission.
//
// 	THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
// 	EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// 	WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// 	DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
// 	DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// 	(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// 	LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// 	ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// 	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// 	SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//*******************************************************************************


package com.dannypatterson.remoting {
	
	import flash.utils.clearTimeout;
	import flash.utils.setTimeout;
	
	/**
	 * @author Danny Patterson
	 * @version 1.0.0 2006-07-03
	 */	
	public class OperationPool {
		
		private static var instance:OperationPool;
		private var delayInterval:uint;
		private var operationList:Array;
		
		public function OperationPool(enforcer:SingletonEnforcer) {
			operationList = new Array();
		}
		
		private function onDelayedOperations():void {
			var operations:Array = operationList.slice(0, operationList.length);
			operationList = new Array();
			while(operations.length > 0) {
				Operation(operations.shift()).execute();
			}
		}
		
		public static function getInstance():OperationPool {
			if(OperationPool.instance == null) {
				OperationPool.instance = new OperationPool(new SingletonEnforcer());
			}
			return OperationPool.instance;
		}
		
		public function addOperation(operation:Operation):void {
			clearTimeout(delayInterval);
			delayInterval = setTimeout(onDelayedOperations, 100);
			operationList.push(operation);
		}
		
	}
}

class SingletonEnforcer {}